package com.ten.java.doinit.service.create.impl;

import com.ten.java.doinit.common.Context;
import com.ten.java.doinit.service.DBService;
import com.ten.java.doinit.service.create.CreateFileService;
import com.ten.java.doinit.util.DateUtils;
import com.ten.java.doinit.util.IOUtils;
import com.ten.java.doinit.util.StringUtils;

import java.io.File;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;

/**
 * @author zhangxs
 * @date 2022/7/11 14:08
 */
public class CreateServiceService implements CreateFileService {

    @Override
    public String getDirName() {
        return "service";
    }

    @Override
    public void createFile(String dirPath, Map<String, List<DBService.Column>> tableInfo) {
        Set<Map.Entry<String, List<DBService.Column>>> entries = tableInfo.entrySet();
        StringBuilder fileBuffer = new StringBuilder();
        for (Map.Entry<String, List<DBService.Column>> entry : entries) {
            String tableName = entry.getKey();

            // 创建文件
            String modelName = StringUtils.camelFormat(tableName, true);
            String daoName = modelName + "Repository";
            String fileName = modelName + "Service";
            File file = new File(dirPath + File.separator + fileName + ".java");

            // 写入包路径
            fileBuffer.append(StringUtils.format("package <>.<>;", Context.Config.packagePath, getDirName())).append(StringUtils.ENTER).append(StringUtils.ENTER);

            // 引入依赖
            fileBuffer.append("import lombok.extern.slf4j.Slf4j;").append(StringUtils.ENTER);
            fileBuffer.append("import org.springframework.stereotype.Service;").append(StringUtils.ENTER);
            fileBuffer.append("import org.springframework.beans.factory.annotation.Autowired;").append(StringUtils.ENTER);
            fileBuffer.append(StringUtils.format("import <>.dao.<>;", Context.Config.packagePath, daoName)).append(StringUtils.ENTER).append(StringUtils.ENTER);

            // 写入类注释
            fileBuffer.append("/**").append(StringUtils.ENTER);
            fileBuffer.append(" * ").append(StringUtils.ENTER);
            fileBuffer.append(" * @author ").append(Context.Config.author).append(StringUtils.ENTER);
            fileBuffer.append(" * @date ").append(DateUtils.now(Context.Config.pattern)).append(StringUtils.ENTER);
            fileBuffer.append(" */").append(StringUtils.ENTER);;

            // 写入类注解
            fileBuffer.append("@Slfj4").append(StringUtils.ENTER);
            fileBuffer.append("@Service").append(StringUtils.ENTER);

            // 写入类名称
            Optional<DBService.Column> optional = entry.getValue().stream().filter(column -> "PRI".equals(column.getColumnKey())).findFirst();
            String idType = optional.isPresent() ? Context.Config.columnMap.get(optional.get().getDataType()) : "?";
            fileBuffer.append(StringUtils.format("public class <>  {", fileName)).append(StringUtils.ENTER).append(StringUtils.ENTER);

            // 写入dao
            fileBuffer.append(StringUtils.TAB).append("// ").append(StringUtils.ENTER);
            fileBuffer.append(StringUtils.TAB).append("@Autowired").append(StringUtils.ENTER);
            fileBuffer.append(StringUtils.TAB).append(StringUtils.format("private <> <>;", fileName, StringUtils.firstCharLowerCase(fileName))).append(StringUtils.ENTER);

            // 写入类最后一个括号
            fileBuffer.append("}");

            // 将数据写入到文件
            IOUtils.write(fileBuffer.toString(), file, Context.Config.charset);
            fileBuffer.delete(0, fileBuffer.length());
        }
    }
}
